package com.hb.core.pojo.center.au.dto;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.hb.core.pojo.RoleDataAuthEntity;
import com.hb.core.pojo.center.au.entity.Role;
import com.hb.core.pojo.center.sys.dto.MenuResourceDTO;
import com.hb.core.pojo.enums.RoleDataAuthEnum;
import com.hb.core.pojo.enums.RoleSignEnum;
import lombok.Getter;
import lombok.Setter;
import org.fzzn.core.util.Enums;
import org.fzzn.core.util.encrypt.PinyinUtil;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 角色信息数据传输对象
 *
 * @author zhaojk
 */
@Setter
@Getter
public class RoleDTO extends Role implements Comparable<Role> {

    /**
     * 数据权限查询条件
     */
    private RoleDataAuthEntity dataAuth;

    /**
     * 角色所拥有的菜单及按钮权限
     */
    private List<MenuResourceDTO> menuResources;

    /**
     * 角色所拥有的菜单及按钮权限
     */
    private List<Long> resIds;

    /**
     * 获取角色下用户成员列表格式, 返回形式(1: 分页对象, 2: 列表对象)
     */
    private Integer pageFlag;

    /**
     * 所属企业名称
     */
    private String orgName;

    /**
     * 帐号等级
     */
    private Integer accountLevel;

    /**
     * 用户所用的角色标识
     *
     * @see com.hb.core.pojo.enums.RoleSignEnum
     */
    private List<Long> roleSigns;


    /**
     * 角色下的用户成员
     * com.hb.core.pojo.center.au.dto.RoleDTO#pageFlag
     * 为 1 时返回分页对象
     * 为 2 时返回数组
     *
     * @see RoleDTO#pageFlag
     */
    private Object users;

    /**
     * 自动生成[角色代码], [角色类型]字段值
     */
    public void init() {
        if (getParentId() == null) {
            setParentId(0L);
        }
        // 角色代码
        String roleCode = getRoleCode();
        if (StrUtil.isEmpty(roleCode)) {
            setRoleCode(PinyinUtil.getPingYin(getRoleName()));
        }
    }

    /**
     * 参数验证方法
     * 所有的继承该类的DTO对象必须在调用时重写该方法
     *
     * @return
     */
    @Override
    public String paramsValid(String... fieldNames) {
        String roleName = getRoleName();
        if (StrUtil.isEmpty(roleName)) {
            return "角色名称不能为空";
        }
        if (4 > StrUtil.length(roleName) || StrUtil.length(roleName) > 20) {
            return "角色名称的长度应该在 4 - 20 位之间";
        }
        return null;
    }

    @Override
    public int compareTo(@NotNull Role role) {
        Integer roleDataAuth = getRoleDataAuth();
        if (roleDataAuth != null) {
            return NumberUtil.compare(roleDataAuth, role.getRoleDataAuth());
        }
        if (role.getRoleDataAuth() == null) {
            return 0;
        }
        return -1;
    }

    /* 后台管理相关字段 start */
    private String roleSignName;
    private String roleTypeName;
    private String roleDataAuthName;
    /* 后台管理相关字段 end */
}
